package com.douma._2022;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class 磁盘容量排序 {

    /*
    题目描述：

    磁盘的容量单位常用的有 M、G、T 这撒安格等级，它们之间的换算关系为 1T = 1024G、1G = 1024G
    现在给定 n 块磁盘的容量，请对它们按从小到大的顺序进行稳定排序
    假如给定 5 块盘的容量，1T、20M、3G、10G6T、3M12G9M，那么排序后的结果是 20M、3G、3M12G9M、1T、10G6T
    注意：单位可以重复出现，上述 3M12G9M 表示的容量即为 3M+12G+9M，和 12M12G 相等

    输入描述：
    输入第一行包含一个整数 n (2 <= n <= 100)，表示磁盘的个数，
    接下的 n 行，每行一个字符串 (长度大于 2，小于 30)，表示磁盘的容量，
    由一个或多个格式为 mv 的子串组成，其中 m 表示容量大小，v 表示容量单位，
    例如20M，1T，30G，10G6T，3M12G9M。

    磁盘容量 m 的范围为 1 到 1024 的正整数，容量单位 v 的范围只包含题目中提到的 M，G，T三 种，换算关系如题目描述。

    输出描述：
    输出 n 行，表示 n 块磁盘容量排序后的结果。

    示例 1：
    输入
    3
    1G
    2G
    1024M

    输出
    1G
    1024M
    2G

    说明：1G 和 1024M 容量相等，稳定排序要求保留它们原来的相对位置，故 1G 在 1024M 之前

    示例 2：
    输入
    3
    2G4M
    3M2G
    1T

    输出
    3M2G
    2G4M
    1T

    说明：1T 的容量大于 2G4M，2G4M 的容量大于 3M2G
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        String[] strs = new String[n];
        for (int i = 0; i < n; i++) {
            strs[i] = sc.nextLine();
        }

        // 自定义排序逻辑
        // 这里要是不熟悉的话，请学习课程 A 的排序章节：https://appvpmptkl94774.pc.xiaoe-tech.com/detail/v_623296b9e4b02b8258561773/3?from=p_62791d3ce4b0812e17972cf9&type=6&parent_pro_id=
        Arrays.sort(strs, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int cap1 = getCapacity(o1);
                int cap2 = getCapacity(o2);
                // 返回 -1 的话，那么就是升序排列
                if (cap1 < cap2) return -1;
                // 返回 1  的话，那么就是降序排列，这里需要将 o1 和 o2 的顺序调换下
                else if (cap1 > cap2) return 1;
                // 相等话，则顺序不变，即稳定排序
                return 0;
            }
        });

        for (String str : strs) {
            System.out.println(str);
        }

        sc.close();
    }

    // 将 G 和 T 转换成 M
    // 比如输入 2M2G1T，那么返回 2 + 2 * 1024 + 1 * 1024 * 1024
    private static int getCapacity(String str) {
        int res = 0;
        String num = "";
        for (char c : str.toCharArray()) {
            if (c >= '0' && c <= '9') num += c;
            else {
                int tmp = Integer.valueOf(num);
                if (c == 'M') res += tmp;
                else if (c == 'G') res += (tmp * 1024);
                else if (c == 'T') res += (tmp * 1024 * 1024);
                num = "";
            }
        }
        return res;
    }
}
